home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
ms_dos
/
tool
/
mercury
/
mcstdlib.c
< prev
next >
Wrap
Text File
|
1994-12-26
|
3KB
|
129 lines
/*
MercuryInstaller for MS-DOS
汎用下請けモジュール
*/
#include<stdio.h>
#include<dos.h>
#include<farstr.h>
#include<string.h>
#include<jctype.h>
#include<stdarg.h>
#include"mercury.h"
/*----------------------------far文字列の出力--------------------------------*/
extern int far_fputs(char far *p,FILE *fp)
{
char buf[256];
far_strcpy(buf,p);
return fputs(buf,fp);
}
/*--------------------------- 一定字数への切り詰め --------------------------*/
/* ○sの内容がnバイトを超える場合、nバイト以内になるように修正する。このとき */
/* もし全角文字の泣き別れが発生した場合は上位バイトも同時に削除する。 */
/* ○sで示される領域を直接書き換え、sを返り値として返す。 */
/*---------------------------------------------------------------------------*/
extern char *strchop(char *s,size_t n)
{
if (strlen(s)>n)
{
if (nthctype(s,n-1)==CT_KJ1)
s[n-1] = '\0';
else
s[n] = '\0';
}
return s;
}
/*----------------------画面最下行へのメッセージの出力-----------------------*/
extern int putmessage(char *s,...)
{
va_list ap;
int c;
va_start(ap,s);
printf("\033[%d;1f\033[33m",CON_YWIDTH);
vprintf(s,ap);
printf("\033[0m");
va_end(ap);
c = ds_getch();
printf("\033[%d;1f\033[2K",CON_YWIDTH);
return c;
}
/*-----------------------カーソルの表示の有無を決定--------------------------*/
extern void showcursor(int f)
{
printf("\033[%d;1f",CON_YWIDTH);
if (f)
printf("\033[0v\033[>5l");
else
printf("\033[1v\033[>5h");
printf("\033[2K");
}
/*--------------------------高速farメモリ獲得関数----------------------------*/
/* 標準のfarmalloc/_dos_allocmemは非常に遅く、read_idxfile()内の大部分の時間 */
/* を消費しているため高速版を用意する */
/*---------------------------------------------------------------------------*/
extern void far *far_sbrk(size_t require)
{
static unsigned addr = 0; /* 現在使用中のメモリブロックのアドレス */
static long size = 0; /* addrのサイズ(バイト単位) */
static long pos = 0; /* これまでに使用したバイト数 */
char far *ret;
if (pos+require>size)
{
if (addr!=0)
{
unsigned dummy;
_dos_setblock((pos+15)>>4,addr,&dummy);
}
if (_dos_allocmem(0x1000,&addr))
{
size = addr*16L;
_dos_allocmem(addr,&addr);
if (size>require)
return NULL;
}
else
size = 0x10000;
pos = 0;
}
ret = (char far *)MK_FP(addr,0) + pos;
pos += require;
#if 0
printf("far_sbrk(0x%03X)==%Fp-%Fp\n",require,ret,ret+require-1L);
#endif
return ret;
}
/*---------------------------far_strdup バグ訂正版---------------------------*/
/* 標準のfar_strdup()はnearmalloc()でメモリを確保するらしい */
/*---------------------------------------------------------------------------*/
extern char far *far_strdup(const char far *s)
{
char far *p = farmalloc(far_strlen(s)+1);
if (p==NULL)
return NULL;
else
return far_strcpy(p,s);
}
/*----------------------------End of mcstdlib.c------------------------------*/